#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct{
    char code[6];
    char name[20];
    int      hours;
    char teacher[40];
}strDiscipline;

FILE *fp;

int main(int argc, char *argv[])
{
	return 0;
}

//Dúvida: nao preciso validar se o codigo ja existe nao???
void savDisc(){
    strDiscipline tmp;

    printf("Digite o codigo da disciplina: ");
    fflush(stdin);
    scanf("%s", &tmp.code); //tem que ser gets senão ele só pega a string antes do primeiro espaço

    printf("Digite o nome da disciplina: ");
    fflush(stdin);    
    scanf("%s", &tmp.name);
    
    printf("Digite a carga horaria da disciplina: ");
    fflush(stdin);    
    scanf("%d", &tmp.hours);
    
    printf("Digite o nome do professor da disciplina: ");
    fflush(stdin);    
    scanf("%s", &tmp.teacher);
    
    fp = fopen("myDiscipline", "wb");
    
    if(fp == NULL){
           printf("O arquivo nao pode ser aberto");
           exit(1);
    }
    
    fwrite(&tmp, sizeof(strDiscipline), 1, fp);     
    fclose(fp);
}

strDiscipline* fndDiscCode(char keyCode[]){     
              
    strDiscipline tmp, *p;     
    
    fp = fopen("myDiscipline", "rb");
    
    if(fp == NULL){
       printf("O arquivo nao pode ser aberto");
       exit(1);
    }
    
    while(!feof(fp)){
        fread(&tmp, sizeof(strDiscipline), 1, fp);   
        if(tmp.code == keyCode){
            p = &tmp;
            fclose(fp);            
            return p;              
        }
    }
    fclose(fp);
                      
    return (NULL);
}


strDiscipline* fndDiscName(char keyName[]){     
    strDiscipline tmp, *p;     
    
    fp = fopen("myDiscipline", "rb");
    
    if(fp == NULL){
       printf("O arquivo nao pode ser aberto");
       exit(1);
    }
    
    while(!feof(fp)){
        fread(&tmp, sizeof(strDiscipline), 1, fp);   
        if(tmp.name == keyName){  //nao seria mais seguro usar strcmp nao?
            p = &tmp;
            fclose(fp);              
            return p;
        }
    }
    fclose(fp);
    
    return (NULL);
}

/**
 * Funcao que atualiza a disciplina
 */

void updDiscipline(char keyCode[],char keyName[]){
    strDiscipline tmp, *p;

    fp = fopen("myDiscipline", "r+b");

    if(fp == NULL){
       printf("O arquivo nao pode ser aberto");
       exit(1);
    }

    while(!feof(fp)){

        if(fread(&tmp, sizeof(strDiscipline), 1, fp)!=1){
            puts("Nao foi possivel realizar a leitura.");
        }else{
            if((strcmp(tmp.name,keyCode)!=0)||(strcmp(tmp.name,keyName)!=0)){
                printf("Codigo:%s\nNovo codigo:",tmp.code);
                fflush(stdin);
                gets(tmp.code);
                printf("Nome:%s\nNovo nome:",tmp.name);
                fflush(stdin);
                gets(tmp.name);
                printf("Carga horaria:%d\nNova carga horaria:",tmp.hours);
                fflush(stdin);
                scanf("%d",&tmp.hours);
                printf("Professor:%s\nNovo professor:",tmp.teacher);
                fflush(stdin);
                gets(tmp.teacher);

                if(fwrite(&tmp, sizeof(strDiscipline), 1, fp)!=1){
                    printf("Nao foi possivel realizar a atualizacao.");
                }
                fclose(fp);
                break;
            }
            }
        }
}

/**
 * Funcao que retorna a struct no terminal
 */
void showDiscipline(strDiscipline *pDisc){
    strDiscipline tempDisc=*pDisc;
    printf("\nCodigo da disciplina: %s\n",tempDisc.code);
    printf("Nome da disciplina: %s\n",tempDisc.name);
    printf("Carga horaria: %d\n",tempDisc.hours);
    printf("Professor: %s\n\n",tempDisc.teacher);
}

/**
 * Funcao que retorna todas as structs do arquivo no terminal
 */
void showListDiscipline(){
    strDiscipline tmp;

    fp = fopen("myDiscipline", "rb");

    if(fp == NULL){
       printf("O arquivo nao pode ser aberto");
       exit(1);
    }

    while(!feof(fp)){
        fread(&tmp, sizeof(strDiscipline), 1, fp);
        showDiscipline(&tmp);
    }
    fclose(fp);
}

/**
 * Funcao que compara se parte da string pertence a outra string  - TESTAR funcao strstr(char str1[],char str2[]),acho que ja faz isso
 */

void compareNamePiece(char strOriginal[],char strPiece[]){  // mudar para ENUM BOOLEAN
	int i;
	for(i=0;i<strlen(strPiece);i++){
		if(toupper(strPiece[i])!=toupper(strOriginal[i])){
			printf("%c e diferente de %c ",strOriginal[i],strPiece[i]);
			break;
		}
	}
}

// Submenu para remoção de disciplina.
int removeDscpMen(){
	char rm_code[6] = "\0";
	char rm_name[20] = "\0";
	int opt_men = -1;
	
	do{
		printf("1- Remover pelo código\n2- Remover pelo nome\n0 - Voltar ao menu principal\n_: ");
		scanf("%d", &opt_men);
		if(opt_men == 1){
			printf("Digite o código da disciplina: ");
			scanf("\n%s", rm_code);
			removeDscp(rm_code);
			break;
		}
		if(opt_men == 2){
			printf("Digite o nome da disciplina: ");
			scanf("\n%s", rm_name);
			removeDscp(rm_name);
			break;
		}
	}while(opt_men != 0);
	
	return 0;
}

// Abrir um arquivo com verificação de erro.
FILE *openFile(char *str_file, char *str_mode){
	FILE *fp = NULL;
	
	fp = fopen(str_file, str_mode);
	if(fp == NULL){
		printf("O arquivo nao pode ser aberto");
		exit(1);
	}
	return fp;
}

// Retorna a "posição" da disciplina a ser excluida.
int find2remove(char *search){
	int position = 1;
	strDiscipline dscp;
	FILE *fp = openFile("myDiscipline", "rb");
	
	// Testa cada disciplina até encontrar a que foi solicitada.
	while(1){
		fread(&dscp, sizeof(strDiscipline), 1, fp);
		if( (dscp.name == search) || (dscp.code == search) ){
			fclose(fp);
			return position;
		}
		position++;
	}
	// Caso não encontre a disciplina.
	fclose(fp);
	return 0;
}

// ABSTRAÇÃO: Remove uma disciplina do arquivo.
// MODO DE EXECULÇÃO: Copia as estruturas do arquivo "myDiscipline" para "myDiscipline2" exceto a estrutura que será excluida,
//                    exclui o primeiro arquivo e renomeia o segundo com o nome do primeiro.

int removeDscp(char *rm_try){
	strDiscipline aux_dscp;
	FILE *fp = openFile("myDiscipline", "rb");
	FILE *fp2 = openFile("myDiscipline2", "wb");
	int i = 0;
	int position = 0;
	
	position = find2remove(rm_try);
	if(position > 0){
		rewind(fp);
		for(i=1; i<position; i++){
			fread(&aux_dscp, sizeof(strDiscipline), 1, fp);
			fwrite(&aux_dscp, sizeof(strDiscipline), 1, fp2);
		}
		fseek(fp, sizeof(strDiscipline), SEEK_CUR);
		while(!feof(fp)){
			fread(&aux_dscp, sizeof(strDiscipline), 1, fp);
			fwrite(&aux_dscp, sizeof(strDiscipline), 1, fp2);
		}
		fclose(fp);
		fclose(fp2);
		remove("myDiscipline");
		rename("myDiscipline2","myDiscipline");
		printf("Remoção realizada com socesso");
		getchar();
		return 0;
	}
	printf("Disciplina não encontrada.");
	fclose(fp);
	fclose(fp2);
	return 1;
}

int main(int argc, char *argv[]){
	return 0;
}
